# -*- coding: utf-8 -*-

# @Project : UI_DDTFrameWork
# @Author  : Mr.Deng
# @Time    : 2021/9/19 0:34

"""
使用js脚本，页面按像素值滚动、滚动到最底部、按可见元素位置滚动、删除元素属性、修改元素属性
"""

from common.seleniumLibrary.base import Base
from common.tools.decorator import error_collection


class JavaScript(Base):
    """
    ** 滚动方法不生效，后置增加sleep强制等待
    eg：
    1、页面滚动："window.scrollBy(0,500)"
    2、页面滚动到元素指定位置："arguments[0].scrollIntoView();", element
    3、页面滚动到最底部："window.scrollTo(0,document.body.scrollHeight);"
    4、打开另一个页面："window.open('http:www.xxx.com')"
    5、修改页面元素属性："arguments[0].removeAttribute('readonly');", element
    """

    def use_js(self, js: str):
        """
        执行js脚本
        :param js: js脚本
        :return:
        """
        self.driver.execute_script(js)
        self.Log.info(f"执行js脚本：{js}")

    def scroll_page_by_pix(self, pix: str = 500):
        """
        页面滚动多少像素点
        :param pix:
        :return:
        """
        self.use_js(js=f"window.scrollBy(0, {pix})")
        self.Log.info(f"页面滚动：{pix} 像素点")

    def scroll_page_bottom(self):
        """
        滚动到页面最底部
        :return:
        """
        self.use_js(js="window.scrollTo(0,document.body.scrollHeight);")
        self.Log.info("页面滚动到最底部")

    @error_collection
    def scroll_page_arrive_element(self, elementPath: tuple):
        """
        滚动到指定元素位置
        :param elementPath:
        :return:
        """
        arriveElement = self._find_element(elementPath)
        self.driver.execute_script("arguments[0].scrollIntoView();", arriveElement)
        self.Log.info(f"页面滚动到元素：{elementPath} 位置可见")

    @error_collection
    def del_element_attribute(self, elementPath: tuple, attributeName: str):
        """
        删除页面元素某一属性，输入框被禁用后可以修改属性来直接send_keys
        :param elementPath:
        :param attributeName: 属性名称
        :return:
        """
        findElement = self._find_element(elementPath)
        self.driver.execute_script(f"arguments[0].removeAttribute('{attributeName}');", findElement)
        self.Log.info(f"删除页面元素：{elementPath} 属性值：{attributeName}")

    @error_collection
    def set_element_attribute(self, elementPath: tuple, attributeName: str):
        """
        修改页面元素某一属性
        :param elementPath:
        :param attributeName: 属性名称
        :return:
        """
        findElement = self._find_element(elementPath)
        self.driver.execute_script(f"arguments[0].setAttribute('{attributeName}');", findElement)
        self.Log.info(f"删除页面元素：{elementPath} 属性值：{attributeName}")


# if __name__ == '__main__':
#     from common.seleniumLibrary import PySelenium
#     from selenium.webdriver.common.by import By
#
#     element = PySelenium()
#     element.open_url("http://news.baidu.com/")
#     element.scroll_page_arrive_element(elementPath=(By.ID, 'city_name'))
